From 8567b6718e2efa53912c1dedf8a888cf9c3fc4d3 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Wed, 21 Feb 2007 20:30:37 +0000 Subject: [PATCH] x86: Only unshadow on failed emulation, not when an exception is raised. Signed-off-by: Keir Fraser --- xen/arch/x86/mm/shadow/multi.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c index e73fdeecd4..cce70bc522 100644 --- a/xen/arch/x86/mm/shadow/multi.c +++ b/xen/arch/x86/mm/shadow/multi.c @@ -2915,7 +2915,12 @@ static int sh_page_fault(struct vcpu *v, if ( !(regs->error_code & PFEC_user_mode) ) r = x86_emulate(&emul_ctxt.ctxt, emul_ops); - if ( (r == X86EMUL_UNHANDLEABLE) || (r == X86EMUL_EXCEPTION) ) + /* + * NB. We do not unshadow on X86EMUL_EXCEPTION. It's not clear that it + * would be a good unshadow hint. If we *do* decide to unshadow-on-fault + * then it must be 'failable': we cannot require the unshadow to succeed. + */ + if ( r == X86EMUL_UNHANDLEABLE ) { SHADOW_PRINTK("emulator failure, unshadowing mfn %#lx\n", mfn_x(gmfn)); -- 2.30.2